package tech.aistar.day06.design.lsp;

/**
 * 本类用来演示:
 * 总结:
 * a. 开发中子类尽量不要重写父类的方法
 * b. 子类尽量不要破坏父类的结构
 * c. 凡是可以使用父类的地方可以直接使用子类来进行替换
 *
 * Sup - Father
 * Sub - FatherSub
 *
 * 测试 - FatherSub
 * sup.test01(fatherSub);//Sup...
 * sub.test01(fatherSub);//Sub...
 *
 * 接着测试 - Father
 * sup.test01(father);//Sup..
 * sup.test02(father);//Sup...
 *
 * ------
 *
 * Sup = FatherSub
 * Sub = Father
 *
 * 测试 - FatherSub
 * sup.test02(fatherSub);//Sup...
 * sub.test02(fatherSub);//Sup...
 *
 * 接着测试 - Father
 * sup.test02(father);//error
 *
 * sub.test02(father);//ok  sub...
 *
 *
 * @author: success
 * @date: 2021/3/15 3:24 下午
 */
public class Sup {
    public void test01(Father father){
        System.out.println("Sup...");
    }

    public void test02(FatherSub fatherSub){
        System.out.println("Sup...");
    }
}

class Sub extends Sup{
    //里氏替换原则 - 子类尽量不要去破坏父类的结构,子类尽量不要去重写父类的方法.

    //子类的类型比父类同名的方法的参数类型小 - 严谨
    public void test01(FatherSub fatherSub){
        System.out.println("Sub...");
    }

    //子类的类型比父类同名的类型要更加宽松
    public void test02(Father father){
        System.out.println("Sub...");
    }
}

class TestSup{
    public static void main(String[] args) {
        FatherSub fatherSub = new FatherSub();
        //使用父类
        //测试 - 符不符合里氏替换原则的思想 - 凡是可以使用父类的地方直接换成子类
//        Sup sup = new Sup();
//        sup.test01(fatherSub);//Sup...
//
//        Sub sub = new Sub();
//        sub.test01(fatherSub);//Sub...
        //无论如何怎么调用,此处只会调用子类中的test01方法.

        Sup sup = new Sup();
        sup.test02(fatherSub);//Sup...

        Sub sub = new Sub();
        sub.test02(fatherSub);//Sup...

        Father f = new Father();
        sub.test02(f);//Sub...

    }
}
